tg-me.com/java_fillthegaps/626
Last Update:
Java 25: новый формат конструктора
Сегодня расскажу про новую фичу в осенней джаве. Суть простая - this и super не обязательно должны идти первой строкой в конструкторе.
Зачем это нужно? Чтобы упростить валидацию.
Сейчас, чтобы добавить проверку аргументов, приходится оборачивать аргументы в методы:
class Employee extends Person {
private static int verifyAge(int value) {
if (age < 18)
throw new IllegalArgumentException(...);
return value;
}
Employee(int age) {
super(verifyAge(age));
}
}
С новым JEP эти костыли не нужны, нужные проверки пишем в начале конструктора:
class Employee extends Person {
Employee(int age) {
if (age < 18)
throw new IllegalArgumentException(...);
super(age);
}
}
Области кода вокруг this/super называются очень литературно: пролог и эпилог🥰
public Person {
// prologue
super();
// epilogue
}
В пролог нельзя вставить любой код:
❌ Нельзя обращаться к переменным родителя
❌ Нельзя вызывать нестатические методы
❌ Нельзя вызвать return
✅ Можно присвоить поля текущего класса
Особо не разгуляешься, всё же основной сценарий фичи — валидация входных параметров.
Ещё из интересного:
1️⃣ В JVM не пришлось ничего менять
Потому что правила "this обязательно первый" в JVM нет. Это ограничение только на уровне языка, чтобы упростить работу компилятора:)
2️⃣ Меняется ответ на частый собесный вопрос "в каком порядке инициализируются переменные". Раньше порядок для нестатических полей был такой:
Поля Parent - Конструктор Parent - Поля Child - Конструктор Child
В Java 25 поля наследника можно инициализировать ДО вызова конструктора родителя:
Employee(int age, String officeID) {
this.officeID = officeID;
super(age);
}
Общая схема с этими прологами-эпилогами очень усложняется.
3️⃣ Фича называется Flexible Constructor Bodies. Я не смогла придумать адекватный перевод, поэтому очень интересно, как её переведут в статьях-обзорах:)
BY Java: fill the gaps
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/java_fillthegaps/626